#include "processbar.h"

#define Length 101 //最后还有'\0'
#define Style '#'
const char* label = "|/-\\";//图标；label标签

//version1
void Proc1()
{
    char cont[Length] = {0}; //cont内容
    //先将数组全部初始化为'\0'，保证数组几个字符，字符串就有多长———不写行
    //memset(cont, '\0', num);//不写也行，因为创建是已经初始化了
    int i = 0;
    for (i=0; i<Length-1; i++)//[0, 100)
    {
        cont[i] = Style;
        //\r回车，光标会到一行的最开始，再次写入数据就会覆盖
        //a[i%4]设置下标范围0~4-1
        //[%-100s]固定字符串的输出字宽，保证完全覆盖上一次的数据
        printf("[%-100s][%3d%%][%c]\r", cont, i+1, label[i%4]);
        fflush(stdout);//强制刷新输出流缓冲区
        usleep(20000);//睡眠/暂停函数，程序运行时暂停几微秒，头文件unistd.h

    }
    //循环结束后光标在最前面，为了防止命令行提示符覆盖进度条，要换行
    printf("\n");                                                                                  
}

//version2
void Proc2(double current, double total)
{
    //获取下载比率(0<=rate<=100)
    //int rate = (int)(current / total * 100);//小数强转int-->0
    double rate = current*100 / total;//比率
    //printf("%lf\n", rate);
    int loop_count = (int)rate;//循环次数/'#'个数
    //printf("%d\n", loop_count);
    char bar[Length] = {0};//创建并初始化，0在ASCII表中就是'\0'
    memset(bar, 0, Length);//初始化
    //因为调用处会循环输出当前进度条，所以没必要提供动态进度条，提供静态的，经过多次调用也能产生动态效果
    memset(bar, '#', loop_count);//用'#'设置进度
    // for (int i=0; i<loop_count; i++)
    // {
    //     bar[i] = '#';
    // }
    printf("[\033[1;33m%-100s\033[0m][\033[1;33m%3d%%\033[0m][\033[1;33m%c\033[0m]\r", bar, loop_count, label[loop_count%4]);

}
void Download(double total)
{
    double current = 0;//当前下载量；total总量
    double bandwidth = 1.0*1024*1024;//带宽，单位：字节
    int loop_count = total / bandwidth;//循环次数
    for (int i=0; i<loop_count; i++)
    {
        current += bandwidth;
        //每次显示一个进度条
        Proc2(current, total);
        fflush(stdout);
        usleep(20000);
    }
    printf("\n");
}


//version3
void Download2(double total, call_proc3 proc3)
{
    double current = 0;//当前下载量；total总量
    double bandwidth = 1.0*1024*1024;//带宽，单位：字节
    int loop_count = total / bandwidth;//循环次数
    for (int i=0; i<loop_count; i++)
    {
        current += bandwidth;
        //每次显示一个进度条
        proc3(current, total);
        fflush(stdout);
        usleep(20000);
    }
    printf("\n");
}



////老师
//#define Length 101
//#define Style '='
//
//const char *lable = "|/-\\";
//
////version 2
//void ProcBar(double total, double current)
//{
//    char bar[Length];
//    memset(bar, '\0', sizeof(bar));
//    int len = strlen(lable);
//
//    int cnt = 0;
//    double rate = (current*100.0)/total;
//    int loop_count = (int)rate;
//    while(cnt <= loop_count)
//    {
//        bar[cnt++] = Style;
//        //usleep(20000);
//    }
//    printf("[%-100s][%.1lf%%][%c]\r", bar, rate, lable[cnt%len]);
//    fflush(stdout);
//}
